home *** CD-ROM | disk | FTP | other *** search
/ LightWavin' Magazine 2 / LightWavin' Magazine, Issue 2 (LightWavin' Multimedia)(1997).iso / article / reduce / lod.bml next >
Text File  |  1996-10-14  |  4KB  |  223 lines

  1. /* Level of Detail replacement - By Jason Booth
  2.  
  3.     This script is activated as a BML-OR (object replacement) plugin. It is used
  4. to simulate Level of Detail rendering found in many games, and simulator environments.
  5. The user supplies a list of objects, and at what distances they should be used. During
  6. rendering, the objects are swapped in acourdingly.. Files are saved, and can be recalled
  7. for settings.
  8.  
  9. */
  10.  
  11.  
  12.     var numlevels = 2,loop,f,ours,nfname;
  13.     var c[10],c2[10];
  14.     var lodID = "";
  15.     var newfile[10];
  16.     var distance[10];
  17.     var c1,c3,c4,c5,c6,items[4],what = 1;
  18.  
  19. //-----------------------------------------------------------------
  20. // save() is activated when the user saves a scene file where this
  21. // script is active.  in save(), we need to store our operating
  22. // parameters into the scene file.
  23.  
  24. save: what, io
  25. {
  26.     getoldfile();
  27.  
  28.     if(what == SCENEMODE)
  29.         {
  30.         io.writeln(numlevels);
  31.         io.writeln(lodID);
  32.         do loop = 1 to numlevels
  33.             {
  34.             io.writeln(newfile[loop]);
  35.             io.writeln(distance[loop]);
  36.             }
  37.         }
  38. }
  39.  
  40. load: what, io
  41. {
  42.     if(what == SCENEMODE)
  43.         {
  44.         numlevels = number(io.read());
  45.         lodID = io.read();
  46.         do loop = 1 to numlevels
  47.             {
  48.             newfile[loop] = io.read();
  49.             distance[loop] = number(io.read());
  50.             }
  51.         savedeffile();
  52.         }
  53. }
  54.  
  55. create
  56. {
  57.     do loop= 1 to 10
  58.     {
  59.         newfile[loop] = "";
  60.         distance[loop] = string(loop);
  61.     }
  62.     distance[1] = 0;
  63. }
  64.  
  65.  
  66. options
  67. {
  68.     {
  69.     reqbegin("Level of Detail replacement plugin, By Jason Booth..");
  70.  
  71.     items[1] = "Load settings";
  72.     items[2] = "Edit/save setting";
  73.     items[4] = nil;
  74.  
  75.     c1 = addcontrol(what,"What to do:",items);
  76.  
  77.     if (reqpost())
  78.     {
  79.         what = getvalue(c1);
  80.     }
  81.     else
  82.         return;
  83.  
  84.     if (what == 1)
  85.         {
  86.         loadlod();
  87.         }
  88.  
  89.  
  90.     if (what == 2)
  91.         {
  92.         getlevels();
  93.         }
  94.  
  95.  
  96.         f = file(lodID,"w");
  97.         f.writeln(numlevels);
  98.         do loop = 1 to numlevels
  99.         {
  100.             f.writeln(newfile[loop]);
  101.             f.writeln(distance[loop]);
  102.         }
  103.         f.close();    
  104.     reqend();
  105.     }
  106. }
  107.  
  108. getoldfile
  109. {
  110.     f = file(lodID,"r");
  111.     numlevels = number(f.read());
  112.     do loop = 1 to numlevels
  113.     {
  114.         newfile[loop] = f.read();
  115.         distance[loop] = number(f.read());
  116.     }
  117.     f.close();
  118. }
  119.  
  120. savedeffile
  121. {
  122.     f = file(lodID,"w");
  123.     f.writeln(numlevels);
  124.     do loop = 1 to numlevels
  125.     {
  126.         f.writeln(newfile[loop]);
  127.         f.writeln(distance[loop]);
  128.     }
  129.     f.close();
  130. }
  131.  
  132.  
  133. process: obj
  134. {
  135.     // set first object to one in the scene file.. //
  136.  
  137.     ours = obj.objID;
  138.  
  139.     getoldfile();
  140.         distance[1] = 0;
  141.  
  142.  
  143.  
  144.  
  145.     // get camera location, object location, and compare for distance //
  146.  
  147.     var cam,camloc[3],objloc[3],objfname;
  148.     cam = getfirstitem(CAMERA);
  149.     camloc = cam.param(WPOSITION,obj.newTime);
  150.  
  151.     objloc = ours.param(WPOSITION,obj.newTime);
  152.  
  153.     objfname = obj.curFilename;
  154.  
  155.     var x2,y2,z2,dis;
  156.     x2 = (camloc[1]-objloc[1]);
  157.     y2 = (camloc[2]-objloc[2]);
  158.     z2 = (camloc[3]-objloc[3]);
  159.     x2 = pow(x2,2);
  160.     y2 = pow(y2,2);
  161.     z2 = pow(z2,2);
  162.     dis = sqrt(x2+y2+z2);
  163.  
  164.     var level=0;    // if level is 0 keep original geometry //
  165.  
  166.     do loop = 1 to numlevels
  167.         {
  168.         if (dis>=distance[loop])
  169.             level = loop;
  170.         }
  171.  
  172.     if(level!=0)
  173.         nfname = newfile[level];
  174.  
  175.     if (level == 0)
  176.         nfname = objfname;
  177.  
  178.     obj.newFilename = nfname;
  179. }
  180.  
  181. loadlod
  182. {
  183.     lodID = getfile("Select a level of detail file","*.lod");
  184.     getoldfile();
  185.     return;
  186. }
  187.  
  188. getlevels
  189. {
  190.     c3 = addcontrol(numlevels," Number of LOD's");
  191.     c4 = addcontrol(lodID," Plugin filename");
  192.     if (reqpost())
  193.         {
  194.         numlevels = getvalue(c3);
  195.         lodID = string(getvalue(c4));
  196.         }
  197.         else
  198.             return;
  199.  
  200.  
  201.     c[1] = addcontrol(newfile[1],"level one is your original object ");
  202.     c2[1] = addcontrol(distance[1]," distance to switch should be 0");
  203.  
  204.     do loop=2 to numlevels
  205.         {
  206.             var st = string("filename for level ",loop);
  207.  
  208.             c[loop] = addcontrol(newfile[loop],st);
  209.             c2[loop] = addcontrol(distance[loop]," distance to switch");
  210.         }
  211.     if (reqpost())
  212.     {
  213.     do loop = 1 to numlevels
  214.         {
  215.         newfile[loop] = getvalue(c[loop]);
  216.         distance[loop] = getvalue(c2[loop]);
  217.         }
  218.     }
  219.     else
  220.         return;
  221. }
  222.  
  223.